package appstudio7i.controladores;


import appstudio7i.excepciones.ReservanoEncontrada;
import appstudio7i.modelo.Instrumento;
import appstudio7i.modelo.Adicionales;
import appstudio7i.modelo.Cliente;
import appstudio7i.modelo.Local;
import appstudio7i.modelo.Reserva;
import appstudio7i.modelo.Sala;
import appstudio7i.modelo.Servicio;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.sql.Timestamp;

/**
 *
 * @author Alfredo Mendieta
 */
public class AdmReservas {
    private ArrayList<Reserva> _listaReservas = new ArrayList<Reserva>();
    private ArrayList<Instrumento> _listaInstumentos = new ArrayList<Instrumento>();
    private ArrayList<Adicionales> _listaInstrumentosAdicionales = new ArrayList<Adicionales>();
    private ArrayList<Servicio> _listaServicios = new ArrayList<Servicio>();
    private ArrayList<Cliente> _listaClientes = new ArrayList<Cliente>();
    
    private String sRuta  = "reservas.txt";
    private String sRutaS = "reserva_servicios.txt";
    private String sRutaI = "reserva_instrumentos.txt";
    
    public ArrayList<Reserva> inicializarTablaReservas(){
        FileReader fr  = null;
        BufferedReader br = null;
       
       try{
           fr = new FileReader(sRuta);
           br = new BufferedReader(fr);
           
           String linea;
           Reserva oReserva = null;
           while ((linea = br.readLine()) != null){
               String datos[] = linea.split("#");
               oReserva = new Reserva(datos[0], datos[1], datos[2], datos[3], datos[4], 
                                      normalizeTimestamp(datos[5]), normalizeBigDecimal(datos[6]), Integer.parseInt(datos[7]), 
                                      datos[8], datos[9], datos[10]); 
               _listaReservas.add(oReserva);
           }
       } catch (FileNotFoundException e) {
 
            	e.printStackTrace();
      	} catch (IOException e) {
 
            	e.printStackTrace();
      	} finally {
 
            	try {
                 	if (null != fr) {
                      	fr.close();
                 	}
            	} catch (Exception e2) {
                 	e2.printStackTrace();
            	}
      	}

       
       return this._listaReservas;
    }
    
    public void agregarReserva(String _idReserva ){
        Cliente cliente = new Cliente();
        Reserva reserva = new Reserva();
        reserva.setIdReserva(_idReserva);
        reserva.setIdCliente(cliente.getCodigo());
        
    }

    

    public boolean reservaSalaEnsayo(String codigo, String fechainicio, String fechafin, String horainicio, String horafin, 
            Timestamp sqlTimestamp, BigDecimal costo, int estado, 
            String idSala, String idCliente, String idLocal) {

       // Debo buscar Sala
        boolean registrado = false;   
        Reserva reserva = new Reserva(codigo, fechainicio, fechafin, horainicio, horafin, sqlTimestamp, costo, estado, idSala, idCliente, idLocal);
        _listaReservas.add(reserva);
        registrado = true;
        actualizaTablaReservas();
        return registrado;
   }

    private void actualizaTablaReservas() {
        try {
            PrintWriter pw = new PrintWriter(new FileWriter(sRuta));
            for( Reserva reserva : _listaReservas){
                pw.println(reserva.getIdReserva() + "#" 
                         + reserva.getFechaInicio() + "#"
                         + reserva.getFechaFin() + "#"
                         + reserva.getHoraInicio() + "#"
                         + reserva.getHoraFin() + "#"
                         + reserva.getFecha() + "#"
                         + reserva.getCosto() + "#"
                         + reserva.getEstado() + "#"
                         + reserva.getIdSala() + "#"
                         + reserva.getIdCliente() + "#"
                          );
            }
            pw.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }        
    }
    
    
    public ArrayList<Reserva> ConsultarReservaporFecha(String fecha,String sala){
        
        AdmSalas salas=new AdmSalas();
        AdmReservas reserva=new AdmReservas();
        
   
         ArrayList<Reserva> _listaReservasEncontradas = new ArrayList<Reserva>();
         ArrayList<Sala> _listaSalasEncontradas = new ArrayList<Sala>();
         
         _listaSalasEncontradas= salas.cargarDatos();
         _listaReservas= inicializarTablaReservas();
         
         String codSala="";
       
       //buscamos el codigo de la sala
       for(Sala s:_listaSalasEncontradas){
           if(s.getNombre().equals(sala.trim())){
              codSala=s.getCodigo();
           }
           
       }

           for(Reserva r:_listaReservas){
            if(r.getFechaInicio().equals(fecha)||r.getIdSala().equals(codSala)){
                _listaReservasEncontradas.add(r);
               
            }
            }
        
         if( _listaReservasEncontradas.size()==0){
            throw new ReservanoEncontrada("reserva no encontrada");
       }
        
        return _listaReservasEncontradas;
        
        
        
    }
    public String buscarClientedeReserva(String codigo){
        
        AdmClientes cliente=new AdmClientes();
        _listaClientes=cliente.inicializarTablaCliente();
      
        
               for(Cliente c :_listaClientes){
                 if(c.getCodigo().equals(codigo)){
                         
                 return c.getNombres();
                 }
           
    }
      return null;  
    }
    
    public ArrayList<Sala> buscarSala(String _idSala, Local _local, int _capacidad, boolean _conGrabacion, String _fecha, String _horaInicio, String _horafin ){
        AdmSalas adm =new AdmSalas();
        AdmClientes cli = new AdmClientes();
        AdmLocales locales = new AdmLocales();
        ArrayList<Sala> _listaSalas = adm.cargarDatos();

        // Verficar de que local es
        ArrayList<Local> loc = new ArrayList<Local>();
        Local local = locales.buscarLocal(_local.getCodigo());
        System.out.println(local.getCodigo() + "  " + local.getNombre());

        // Verficar si existe sala
        Sala sala = adm.obtenerSala(_idSala);
        System.out.println(_listaSalas.size());
        for(Sala _sala : _listaSalas){
                System.out.println(_sala.getCodigo() + "  " + _sala.getNombre() + "  " + _sala.getCosto());
        }
                //return _listaSalas;
        
        
        //Obtener Local
        //AdmLocales loc = new AdmLocales();
        //Local local = loc.buscarLocal(_idSala);
        
        

        
        return _listaSalas;
    }

        private Timestamp normalizeTimestamp(String s){
         Date utilDate = new java.util.Date(); //fecha actual
         long lnMilisegundos = utilDate.getTime();
         java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(lnMilisegundos); // dd-mm-yyyy hh:mm:ss             
         return sqlTimestamp;
    }
    
    private BigDecimal normalizeBigDecimal(String s) {
        BigDecimal myDec = null;
        try{
            myDec = new BigDecimal(s);
        }catch(NumberFormatException nfe){
            return null;
        }
    return myDec;
    }     

}
